package com.sybil.ot.controlador;

import com.sybil.ot.dominio.Accion;
import com.sybil.ot.dominio.CausaParo;
import com.sybil.ot.dominio.Clase;
import com.sybil.ot.dominio.Defecto;
import com.sybil.ot.dominio.ResponsableZona;
import com.sybil.ot.dominio.Tarea;
import com.sybil.ot.dominio.TipoTrabajo;
import com.sybil.ot.servicio.CatalogoService;
import com.sybil.ot.servicio.EmpleadoService;
import com.sybil.ot.servicio.ZonaService;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/catalogos")
public class CatalogoControlador {

   @Autowired
   private CatalogoService catalogoService;
   @Autowired
   private EmpleadoService empleadoService;
   @Autowired
   private ZonaService zonaService;

   @RequestMapping(method = RequestMethod.GET)
   public String todos() {
      return "catalogos/todos";
   }

   @RequestMapping(value = "/clases", method = RequestMethod.GET)
   public String clasesLista(Model model) {
      model.addAttribute("clases", catalogoService.obtenerClases());
      return "catalogos/clase_ot/listado";
   }

   @RequestMapping(value = "/clases", params = "form", method = RequestMethod.GET)
   public String formularioClaseNueva(Model model) {
      model.addAttribute(new Clase());
      return "catalogos/clase_ot/nueva";
   }

   @RequestMapping(value = "/clases", params = "form", method = RequestMethod.POST)
   public String claseNueva(@Valid @ModelAttribute Clase clase, BindingResult result) {
      if (result.hasErrors()) {
         return "catalogos/clase_ot/nueva";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         clase.setUsuarioCreo(usuarioActual);
         catalogoService.guardar(clase);
         return "redirect:/catalogos/clases";
      }
   }

   @RequestMapping(value = "/clases/{clave}", params = "form", method = RequestMethod.GET)
   public String formularioClaseEditar(@PathVariable("clave") String clave, Model model) {
      Clase clase = catalogoService.obtenerClase(clave);
      model.addAttribute(clase);
      return "catalogos/clase_ot/editar";
   }

   @RequestMapping(value = "/clases/{clave}", params = "form", method = RequestMethod.POST)
   public String claseEditar(@Valid @ModelAttribute Clase clase, BindingResult result) {
      if (result.hasErrors()) {
         return "catalogos/clase_ot/editar";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         clase.setUsuarioModif(usuarioActual);
         catalogoService.editar(clase);
         return "redirect:/catalogos/clases";
      }
   }

   @RequestMapping(value = "/clases/{clave}", params = "elimina", method = RequestMethod.GET)
   public String claseEliminar(@PathVariable("clave") String clave) {
      catalogoService.eliminarClase(clave);
      return "redirect:/catalogos/clases";
   }

   @RequestMapping(value = "/clases/{clave}", params = "inactiva", method = RequestMethod.GET)
   public String claseInactivar(@PathVariable("clave") String clave) {
      String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
      catalogoService.inactivarClase(clave, usuarioActual);
      return "redirect:/catalogos/clases";
   }

   /**
    * Metodo de TipoTrabajo
    *
    * @param clave
    * @param model
    * @return
    */
   @RequestMapping(value = "/tipostrabajo/clase/{clave}", method = RequestMethod.GET)
   public String tiposTrabajoClaseLista(@PathVariable("clave") String clave, Model model) {
      model.addAttribute("tiposTrabajo", catalogoService.obtenerTiposTrabajo(clave));
      return "catalogos/tipo_trabajo/listado";
   }

   @RequestMapping(value = "/tipostrabajo", method = RequestMethod.GET)
   public String tiposTrabajoLista(Model model) {
      model.addAttribute("tiposTrabajo", catalogoService.obtenerTiposTrabajo());
      return "catalogos/tipo_trabajo/listado";
   }

   @RequestMapping(value = "/tipostrabajo", params = "form", method = RequestMethod.GET)
   public String formularioTipoTrabajoNuevo(Model model) {
      model.addAttribute(new TipoTrabajo());
      model.addAttribute("clases", catalogoService.obtenerClases());
      return "catalogos/tipo_trabajo/nuevo";
   }

   @RequestMapping(value = "/tipostrabajo", params = "form", method = RequestMethod.POST)
   public String tipoTrabajoNuevo(@Valid @ModelAttribute TipoTrabajo tipoTrabajo,
           BindingResult result, Model model) {
      if (result.hasErrors()) {
         model.addAttribute("clases", catalogoService.obtenerClases());
         return "catalogos/tipo_trabajo/nuevo";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         tipoTrabajo.setUsuarioCreo(usuarioActual);
         catalogoService.guardar(tipoTrabajo);
         return "redirect:/catalogos/tipostrabajo";
      }
   }

   @RequestMapping(value = "/tipostrabajo/{clave}", params = "form", method = RequestMethod.GET)
   public String formularioTipoTrabajoEditar(@PathVariable("clave") String clave, Model model) {
      TipoTrabajo tipoTrabajo = catalogoService.obtenerTipoTrabajo(clave);
      model.addAttribute(tipoTrabajo);
      return "catalogos/tipo_trabajo/editar";
   }

   @RequestMapping(value = "/tipostrabajo/{clave}", params = "form", method = RequestMethod.POST)
   public String tipoTrabajoEditar(@Valid @ModelAttribute TipoTrabajo tipoTrabajo, BindingResult result) {
      if (result.hasErrors()) {
         return "catalogos/tipo_trabajo/editar";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         tipoTrabajo.setUsuarioModif(usuarioActual);
         catalogoService.editar(tipoTrabajo);
         return "redirect:/catalogos/tipostrabajo";
      }
   }

   @RequestMapping(value = "/tipostrabajo/{clave}", params = "elimina", method = RequestMethod.GET)
   public String tipoTrabajoEliminar(@PathVariable("clave") String clave) {
      catalogoService.eliminarTipoTrabajo(clave);
      return "redirect:/catalogos/tipostrabajo";
   }

   @RequestMapping(value = "/tipostrabajo/{clave}", params = "inactiva", method = RequestMethod.GET)
   public String tipoTrabajoInactivar(@PathVariable("clave") String clave) {
      String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
      catalogoService.inactivarTipoTrabajo(clave, usuarioActual);
      return "redirect:/catalogos/tipostrabajo";
   }

   /**
    * Metodo de Tarea
    *
    * @param clave
    * @param model
    * @return
    */
   @RequestMapping(value = "/tareas/tipostrabajo/{clave}", method = RequestMethod.GET)
   public String tareaTiposTrabajoLista(@PathVariable("clave") String clave, Model model) {
      model.addAttribute("tareas", catalogoService.obtenerTareas(clave));
      return "catalogos/tarea/listado";
   }

   @RequestMapping(value = "/tareas", method = RequestMethod.GET)
   public String tareaLista(Model model) {
      model.addAttribute("tareas", catalogoService.obtenerTareas());
      return "catalogos/tarea/listado";
   }

   @RequestMapping(value = "/tareas", params = "form", method = RequestMethod.GET)
   public String formularioTareaNueva(Model model) {
      model.addAttribute(new Tarea());
      model.addAttribute("tiposTrabajo", catalogoService.obtenerTiposTrabajo());
      return "catalogos/tarea/nueva";
   }

   @RequestMapping(value = "/tareas", params = "form", method = RequestMethod.POST)
   public String tareaNueva(@Valid @ModelAttribute Tarea tarea, BindingResult result,
           Model model) {
      if (result.hasErrors()) {
         model.addAttribute("tiposTrabajo", catalogoService.obtenerTiposTrabajo());
         return "catalogos/tarea/nueva";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         tarea.setUsuarioCreo(usuarioActual);
         catalogoService.guardar(tarea);
         return "redirect:/catalogos/tareas";
      }
   }

   @RequestMapping(value = "/tareas/{accion}", params = {"clave", "tipot"}, method = RequestMethod.GET)
   public String formularioTareaEditar(
           @PathVariable("accion") String accion,
           @RequestParam(value = "clave") String clave,
           @RequestParam(value = "tipot") String tipoTrabajo,
           Model model) {
      if ("edit".equalsIgnoreCase(accion)) {
         Tarea tarea = catalogoService.obtenerTarea(tipoTrabajo, clave);
         model.addAttribute(tarea);
         return "catalogos/tarea/editar";
      } else if ("elim".equalsIgnoreCase(accion)) {
         catalogoService.eliminarTarea(tipoTrabajo, clave);
         return "redirect:/catalogos/tareas";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         catalogoService.inactivarTarea(tipoTrabajo, clave, usuarioActual);
         return "redirect:/catalogos/tareas";
      }
   }

   @RequestMapping(value = "/tareas/{accion}", method = RequestMethod.POST)
   public String tareaEditar(@Valid @ModelAttribute Tarea tarea, BindingResult result) {
      if (result.hasErrors()) {
         return "catalogos/tarea/editar";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         tarea.setUsuarioModif(usuarioActual);
         catalogoService.editar(tarea);
         return "redirect:/catalogos/tareas";
      }
   }

   /**
    * Metodo de Defecto
    *
    * @param model
    * @return
    */
   @RequestMapping(value = "/defectos", method = RequestMethod.GET)
   public String defectoLista(Model model) {
      model.addAttribute("defectos", catalogoService.obtenerDefectos());
      return "catalogos/defecto/listado";
   }

   @RequestMapping(value = "/defectos", params = "form", method = RequestMethod.GET)
   public String formularioDefectoNuevo(Model model) {
      model.addAttribute(new Defecto());
      return "catalogos/defecto/nuevo";
   }

   @RequestMapping(value = "/defectos", params = "form", method = RequestMethod.POST)
   public String defectoNuevo(@Valid @ModelAttribute Defecto defecto, BindingResult result) {
      if (result.hasErrors()) {
         return "catalogos/defecto/nuevo";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         defecto.setUsuarioCreo(usuarioActual);
         catalogoService.guardar(defecto);
         return "redirect:/catalogos/defectos";
      }
   }

   @RequestMapping(value = "/defectos/{clave}", params = "form", method = RequestMethod.GET)
   public String formularioDefectoEditar(@PathVariable("clave") String clave, Model model) {
      Defecto defecto = catalogoService.obtenerDefecto(clave);
      model.addAttribute(defecto);
      return "catalogos/defecto/editar";
   }

   @RequestMapping(value = "/defectos/{clave}", params = "form", method = RequestMethod.POST)
   public String defectoEditar(@Valid @ModelAttribute Defecto defecto,
           BindingResult result) {
      if (result.hasErrors()) {
         return "catalogos/defecto/editar";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         defecto.setUsuarioModif(usuarioActual);
         catalogoService.editar(defecto);
         return "redirect:/catalogos/defectos";
      }
   }

   @RequestMapping(value = "/defectos/{clave}", params = "elimina", method = RequestMethod.GET)
   public String defectoEliminar(@PathVariable("clave") String clave) {
      catalogoService.eliminarDefecto(clave);
      return "redirect:/catalogos/defectos";
   }

   @RequestMapping(value = "/defectos/{clave}", params = "inactiva", method = RequestMethod.GET)
   public String defectoInactivar(@PathVariable("clave") String clave) {
      String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
      catalogoService.inactivarDefecto(clave, usuarioActual);
      return "redirect:/catalogos/defectos";
   }

   /**
    * Metodo de CausaParo
    *
    * @param model
    * @return
    */
   @RequestMapping(value = "/causas", method = RequestMethod.GET)
   public String causaLista(Model model) {
      model.addAttribute("causas", catalogoService.obtenerCausas());
      return "catalogos/causa_paro/listado";
   }

   @RequestMapping(value = "/causas", params = "form", method = RequestMethod.GET)
   public String formularioCausaNueva(Model model) {
      model.addAttribute(new CausaParo());
      return "catalogos/causa_paro/nueva";
   }

   @RequestMapping(value = "/causas", params = "form", method = RequestMethod.POST)
   public String causaNueva(@Valid @ModelAttribute CausaParo causaParo,
           BindingResult result) {
      if (result.hasErrors()) {
         return "catalogos/causa_paro/nueva";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         causaParo.setUsuarioCreo(usuarioActual);
         catalogoService.guardar(causaParo);
         return "redirect:/catalogos/causas";
      }
   }

   @RequestMapping(value = "/causas/{clave}", params = "form", method = RequestMethod.GET)
   public String formularioCausaEditar(@PathVariable("clave") String clave, Model model) {
      CausaParo causa = catalogoService.obtenerCausa(clave);
      model.addAttribute(causa);
      return "catalogos/causa_paro/editar";
   }

   @RequestMapping(value = "/causas/{clave}", params = "form", method = RequestMethod.POST)
   public String causaEditar(@Valid @ModelAttribute CausaParo causaParo,
           BindingResult result) {
      if (result.hasErrors()) {
         return "catalogos/causa_paro/editar";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         causaParo.setUsuarioModif(usuarioActual);
         catalogoService.editar(causaParo);
         return "redirect:/catalogos/causas";
      }
   }

   @RequestMapping(value = "/causas/{clave}", params = "elimina", method = RequestMethod.GET)
   public String causaEliminar(@PathVariable("clave") String clave) {
      catalogoService.eliminarCausa(clave);
      return "redirect:/catalogos/causas";
   }

   @RequestMapping(value = "/causas/{clave}", params = "inactiva", method = RequestMethod.GET)
   public String causaInactivar(@PathVariable("clave") String clave) {
      String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
      catalogoService.inactivarCausa(clave, usuarioActual);
      return "redirect:/catalogos/causas";
   }

   /**
    * Metodo de Accion
    *
    * @param model
    * @return
    */
   @RequestMapping(value = "/acciones", method = RequestMethod.GET)
   public String accionLista(Model model) {
      model.addAttribute("acciones", catalogoService.obtenerAcciones());
      return "catalogos/accion/listado";
   }

   @RequestMapping(value = "/acciones", params = "form", method = RequestMethod.GET)
   public String formularioAccionNueva(Model model) {
      model.addAttribute(new Accion());
      return "catalogos/accion/nueva";
   }

   @RequestMapping(value = "/acciones", params = "form", method = RequestMethod.POST)
   public String accionNueva(@Valid @ModelAttribute Accion accion,
           BindingResult result) {
      if (result.hasErrors()) {
         return "catalogos/accion/nueva";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         accion.setUsuarioCreo(usuarioActual);
         catalogoService.guardar(accion);
         return "redirect:/catalogos/acciones";
      }
   }

   @RequestMapping(value = "/acciones/{clave}", params = "form", method = RequestMethod.GET)
   public String formularioAccionEditar(@PathVariable("clave") String clave, Model model) {
      Accion accion = catalogoService.obtenerAccion(clave);
      model.addAttribute(accion);
      return "catalogos/accion/editar";
   }

   @RequestMapping(value = "/acciones/{clave}", params = "form", method = RequestMethod.POST)
   public String accionEditar(@Valid @ModelAttribute Accion accion,
           BindingResult result) {
      if (result.hasErrors()) {
         return "catalogos/accion/editar";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         accion.setUsuarioModif(usuarioActual);
         catalogoService.editar(accion);
         return "redirect:/catalogos/acciones";
      }
   }

   @RequestMapping(value = "/acciones/{clave}", params = "elimina", method = RequestMethod.GET)
   public String accionEliminar(@PathVariable("clave") String clave) {
      catalogoService.eliminarAccion(clave);
      return "redirect:/catalogos/acciones";
   }

   @RequestMapping(value = "/acciones/{clave}", params = "inactiva", method = RequestMethod.GET)
   public String accionInactivar(@PathVariable("clave") String clave) {
      String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
      catalogoService.inactivarAccion(clave, usuarioActual);
      return "redirect:/catalogos/acciones";
   }

   /**
    * Metodo de ResponsableZona
    *
    * @param model
    * @return
    */
   @RequestMapping(value = "/responsablesz", method = RequestMethod.GET)
   public String responsableZonaLista(Model model) {
      model.addAttribute("responsables", catalogoService.obtenerResponsablesZona());
      return "catalogos/responsable_zona/listado";
   }

   @RequestMapping(value = "/responsablesz", params = "form", method = RequestMethod.GET)
   public String formularioResponsableZonaNuevo(Model model) {
      model.addAttribute(new ResponsableZona());
      model.addAttribute("empleados", empleadoService.obtenerEmpleados());
      model.addAttribute("zonas", zonaService.obtenerZonas());
      return "catalogos/responsable_zona/nuevo";
   }

   @RequestMapping(value = "/responsablesz", params = "form", method = RequestMethod.POST)
   public String responsableZonaNuevo(@Valid @ModelAttribute ResponsableZona responsableZona,
           BindingResult result, Model model) {
      if (result.hasErrors()) {
         model.addAttribute("empleados", empleadoService.obtenerEmpleados());
         model.addAttribute("zonas", zonaService.obtenerZonas());
         return "catalogos/responsable_zona/nuevo";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         responsableZona.setUsuarioCreo(usuarioActual);
         catalogoService.guardar(responsableZona);
         return "redirect:/catalogos/responsablesz";
      }
   }

   @RequestMapping(value = "/responsablesz/{codigo}", params = {"zona", "ac"}, method = RequestMethod.GET)
   public String formularioResponsableZonaEditar(
           @PathVariable("codigo") String codigoEmpleado,
           @RequestParam(value = "zona") String claveZona,
           @RequestParam(value = "ac") String ac,
           Model model) {
      if ("e".equalsIgnoreCase(ac)) {
         ResponsableZona responsableZona = catalogoService.obtenerResponsablesZona(codigoEmpleado, claveZona);
         model.addAttribute(responsableZona);
         return "catalogos/responsable_zona/editar";
      } else {
         catalogoService.eliminarResponsableZona(codigoEmpleado, claveZona);
         return "redirect:/catalogos/responsablesz";
      }
   }

   @RequestMapping(value = "/responsablesz/{codigo}", params = {"zona", "ac"}, method = RequestMethod.POST)
   public String responsableZonaEditar(@Valid @ModelAttribute ResponsableZona responsableZona,
           BindingResult result) {
      if (result.hasErrors()) {
         return "catalogos/responsable_zona/editar";
      } else {
         String usuarioActual = SecurityContextHolder.getContext().getAuthentication().getName();
         responsableZona.setUsuarioModif(usuarioActual);
         catalogoService.editar(responsableZona);
         return "redirect:/catalogos/responsablesz";
      }
   }
}
